import 'package:get/get.dart';
import 'package:r_upgrade/r_upgrade.dart';

import '../../../apis/base.dart';
import '../../../components/dialog/Dialog.dart';
import '../../../components/status/toast.dart';
import '../../../controller/platform/change_mark.dart';
import '../../../controller/platform/devices_typing.dart';
import '../../../controller/platform/platform_ctrl.dart';
import '../../../model/bean/login_info.dart';
import '../../../pages/Login/bean/input_info.dart';
import '../../../router/router.dart';
import '../../../utils/tools/Tools.dart';

class LoginCtrl extends ChangeMark {
  static const _REMEMBER_PWD = 'REMEMBER_PWD';
  static const _LOGIN_INFO = '_LOGIN_INFO';

  // 记录执行次数
  int runNum = 0;

  // 是否加载完成
  final RxBool initComplete = false.obs;

  // 是否允许向下执行
  final RxBool release = false.obs;

  // 记住密码是否勾选
  RxBool rememePwd = false.obs;

  // 存储更新信息
  final updateInfo = <String, dynamic>{}.obs;

  // 用户信息
  final userinfo = UserInfo().obs;

  // 是否清空密码框的内容
  final RxBool isEmptyPWD = false.obs;

  @override
  void onInit() async {
    super.onInit();

    // 应用信息是否已经获取完成
    if (PlatformCtrl.flag) _checkUpdate();

    // 创建观察者
    PlatformCtrl.putCtrl(this);
  }

  @override
  void onReady() {
    super.onReady();

    // 读取是否记住密码的状态
    rememePwd.value = Tools.getBool(_REMEMBER_PWD);
  }

  @override
  void modify() {}

  @override
  void changeMark(bool result) {
    if (result && runNum < 1) {
      _checkUpdate();
      runNum++;
    }
  }

  /// 读取缓存登录信息
  /// * @return Map<String, dynamic>|历史账户，密码
  Map readLoginInfoCache() {
    Map _loginInfo = {"account": "", "password": ""};
    if (Tools.getBool(_REMEMBER_PWD)) {
      _loginInfo["account"] = Tools.getObj(_LOGIN_INFO)["account"];
      _loginInfo["password"] = Tools.getObj(_LOGIN_INFO)["password"];
    }
    return _loginInfo;
  }

  // 存储记住密码的状态及登录密码
  // * [data] Map<String, dynamic>|存储缓存|必填
  void storeInfo(InputInfo data) {
    // 存储“是否记住密码”的状态
    Tools.setBool(_REMEMBER_PWD, rememePwd.value);

    // 存储登录信息
    if (rememePwd.value) {
      Tools.setObj(_LOGIN_INFO, {
        "account": data.account,
        "password": data.password,
      });
    }
  }

  /// 执行登录操作
  /// * [data] InputInfo|登录信息|必填
  void login(InputInfo data) async {
    // 开启请求动画
    Toast.loading(title: "正在登录...");

    // 执行请求操作
    LoginInfo result = await Base.login({
      "account": data.account,
      "password": data.password,
    });

    // 检查返回结果
    if (result != null) {
      // 存储用户信息
      storeInfo(data);

      // 清空密码框
      if (!rememePwd.value) isEmptyPWD.value = true;

      // 跳转界面
      Get.offAllNamed(AppRoutes.Home);
    }

    // 关闭动画
    Toast.closeToast();
  }

  /// 对话框
  /// * [url] String|下载地址|必填
  void dialog(String url) => Dialogs.alertDialog(
        Get.context,
        content: "新版本已上线，请及时更新",
        confirm: () => Get.offAllNamed(AppRoutes.Update, arguments: {
          "url": url,
        }),
      );

  // 检查更新
  void _checkUpdate() async {
    // 当前app的版本号
    String currentVersion = PlatformCtrl.version;
    // String onlineVersion;

    // 获取线上版本
    Map result = await Base.queryAppEdition();

    if (result != null) {
      // 检查运行平台（Android/Ios）
      if (PlatformCtrl.runPlatform == SystemInfo.android) {
        bool _result = _analysisResult(
          Tools.contrast(result["androidVersion"], currentVersion),
        );

        // 判断对比结果
        if (_result) {
          // 弹窗提示
          dialog(result["androidDownload"]);
        }
      } else {
        // -
        bool _result = _analysisResult(
          Tools.contrast(result["iosVersion"], currentVersion),
        );

        // 判断对比结果
        if (_result) jumpAppStore(result["iosDownload"]);
      }
    }

    // 标记加载完成
    initComplete.value = true;
  }

  // 分析结果
  // * [result] 比对结果|int|必填
  bool _analysisResult(int result) {
    switch (result) {
      case 1:
        // dialog();
        // print("需要更新");
        return true;
      case 0:
        release.value = true;
        return false;
    }
  }

  /// 跳转ios应用市场
  /// * [url] String|必填|下载id
  void jumpAppStore(String url) async {
    bool success = await RUpgrade.upgradeFromAppStore(url);
    if (!success) {
      Toast.fail(title: "无法跳转应用市场");
    }
  }
}
